package com.amsp.oa.oademo.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 */
public class DateUtils {

    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    private static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    private static final String TIMESTAMP_FORMAT = "yyyyMMddHHmmssSSS";

    /**
     * 获取当前时间戳
     * @return 当前时间戳
     */
    public static long getCurrentTimestamp() {
        return System.currentTimeMillis();
    }

    /**
     * 获取当前日期时间字符串
     * @return 格式化的日期时间字符串 yyyy-MM-dd HH:mm:ss
     */
    public static String getCurrentDateTime() {
        return formatDate(new Date(), DEFAULT_DATETIME_FORMAT);
    }

    /**
     * 获取当前日期字符串
     * @return 格式化的日期字符串 yyyy-MM-dd
     */
    public static String getCurrentDate() {
        return formatDate(new Date(), DEFAULT_DATE_FORMAT);
    }

    /**
     * 获取当前时间字符串
     * @return 格式化的时间字符串 HH:mm:ss
     */
    public static String getCurrentTime() {
        return formatDate(new Date(), DEFAULT_TIME_FORMAT);
    }

    /**
     * 生成业务编号
     * @param prefix 业务前缀
     * @return 业务编号 prefix + yyyyMMddHHmmssSSS + 3位随机数
     */
    public static String generateBusinessNo(String prefix) {
        SimpleDateFormat sdf = new SimpleDateFormat(TIMESTAMP_FORMAT);
        String timestamp = sdf.format(new Date());
        String random = String.format("%03d", (int)(Math.random() * 1000));
        return prefix + timestamp + random;
    }

    /**
     * 格式化日期
     * @param date 日期
     * @param pattern 格式模式
     * @return 格式化后的日期字符串
     */
    public static String formatDate(Date date, String pattern) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 解析日期字符串
     * @param dateStr 日期字符串
     * @param pattern 格式模式
     * @return 解析后的日期对象
     */
    public static Date parseDate(String dateStr, String pattern) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            return sdf.parse(dateStr);
        } catch (Exception e) {
            throw new RuntimeException("日期解析失败: " + dateStr, e);
        }
    }

    /**
     * 计算两个日期之间的天数差
     * @param date1 日期1
     * @param date2 日期2
     * @return 天数差
     */
    public static long daysBetween(Date date1, Date date2) {
        long time1 = date1.getTime();
        long time2 = date2.getTime();
        long diff = Math.abs(time1 - time2);
        return diff / (1000 * 60 * 60 * 24);
    }

    /**
     * 判断日期是否在指定范围内
     * @param date 待判断的日期
     * @param start 开始日期
     * @param end 结束日期
     * @return 是否在范围内
     */
    public static boolean isDateInRange(Date date, Date start, Date end) {
        return date.compareTo(start) >= 0 && date.compareTo(end) <= 0;
    }
} 